from typing import Dict, Any
from .base_agent import BaseAgent
from utils import logger

class DocumenterAgent(BaseAgent):
    """文档专家代理 - 负责生成项目文档和API文档"""
    
    def __init__(self):
        super().__init__(
            name="文档专家",
            role="技术文档专家和技术写作师"
        )
    
    def _get_system_prompt(self) -> str:
        return """你是一个专业的技术文档专家，具有以下专业技能：

📚 **文档类型**：
- 项目README和使用指南
- API文档和接口说明
- 开发者文档和部署指南
- 用户手册和操作指南
- 代码注释和内联文档

✍️ **写作技能**：
- 清晰简洁的技术写作
- 结构化的文档组织
- 多层次用户的文档适配
- 示例代码和使用场景
- 图表和流程图设计

📖 **文档标准**：
- Markdown格式规范
- 文档版本管理
- 多语言文档支持
- 可访问性设计
- SEO优化

🎯 **用户导向**：
- 快速上手指南
- 常见问题解答
- 故障排除指南
- 最佳实践建议
- 更新日志维护

请生成专业、完整、用户友好的技术文档。用中文编写。"""
    
    def process(self, input_data: Dict[str, Any]) -> Dict[str, Any]:
        """生成完整的项目文档"""
        generated_code = input_data.get('generated_code', '')
        code_files = input_data.get('code_files', {})
        architecture_design = input_data.get('architecture_design', '')
        requirement_analysis = input_data.get('requirement_analysis', '')
        test_results = input_data.get('test_results', {})
        review_report = input_data.get('review_report', '')
        
        if not any([generated_code, code_files, architecture_design]):
            return {
                'success': False,
                'error': '未提供足够的项目信息'
            }
        
        # 构造文档生成提示
        prompt = f"""
基于以下项目信息生成完整的技术文档：

**需求分析**：
{requirement_analysis}

**架构设计**：
{architecture_design}

**代码文件**：
{self._format_code_files(code_files)}

**测试结果**：
{str(test_results) if test_results else '暂无测试结果'}

**审查报告**：
{review_report[:500] + '...' if len(review_report) > 500 else review_report}

**请生成以下文档**：

## 1. README.md
包含：
- 项目介绍和功能特性
- 快速开始指南
- 安装和配置说明
- 使用示例
- 贡献指南
- 许可证信息

## 2. API文档
包含：
- 接口列表和说明
- 请求/响应格式
- 参数说明和示例
- 错误码定义
- 使用示例

## 3. 开发者文档
包含：
- 项目架构说明
- 代码结构介绍
- 开发环境搭建
- 调试和测试指南
- 贡献流程

## 4. 用户手册
包含：
- 功能详细说明
- 使用教程和技巧
- 常见问题解答
- 故障排除指南

## 5. 部署文档
包含：
- 系统要求
- 部署步骤
- 配置说明
- 监控和维护

每个文档用以下格式分隔：

```markdown
# === 文档: 文件名 ===
# 文档说明

文档内容...
```

请生成专业、完整的技术文档集。
"""
        
        try:
            documentation = self._call_llm(prompt)
            doc_files = self._parse_doc_files(documentation)
            
            # 生成额外的专门文档
            additional_docs = {}
            
            # 生成变更日志
            if code_files:
                changelog = self._generate_changelog(code_files)
                additional_docs['CHANGELOG.md'] = changelog
            
            # 生成架构图文档
            if architecture_design:
                architecture_doc = self._generate_architecture_doc(architecture_design)
                additional_docs['ARCHITECTURE.md'] = architecture_doc
            
            return {
                'success': True,
                'documentation': documentation,
                'doc_files': doc_files,
                'additional_docs': additional_docs,
                'summary': f'文档生成完成，共生成{len(doc_files) + len(additional_docs)}个文档文件'
            }
            
        except Exception as e:
            logger.error(f"文档生成失败: {e}")
            return {
                'success': False,
                'error': str(e),
                'summary': '文档生成失败'
            }
    
    def _format_code_files(self, code_files: Dict[str, str]) -> str:
        """格式化代码文件信息"""
        if not code_files:
            return "暂无代码文件"
        
        formatted = ""
        for file_path, content in code_files.items():
            # 只显示文件结构和函数/类签名
            lines = content.split('\n')
            key_lines = []
            
            for line in lines[:50]:  # 只看前50行
                stripped = line.strip()
                if (stripped.startswith('def ') or 
                    stripped.startswith('class ') or 
                    stripped.startswith('import ') or
                    stripped.startswith('from ')):
                    key_lines.append(line)
            
            formatted += f"\n--- {file_path} ---\n"
            formatted += '\n'.join(key_lines[:10])  # 只显示前10个关键行
            if len(key_lines) > 10:
                formatted += f"\n... 还有 {len(key_lines) - 10} 个定义"
            formatted += "\n"
        
        return formatted
    
    def _parse_doc_files(self, documentation: str) -> Dict[str, str]:
        """解析文档内容，分离不同文件"""
        files = {}
        lines = documentation.split('\n')
        current_file = None
        current_content = []
        
        for line in lines:
            if line.strip().startswith('# === 文档:') and line.strip().endswith('==='):
                # 保存上一个文件
                if current_file and current_content:
                    files[current_file] = '\n'.join(current_content)
                
                # 开始新文件
                current_file = line.strip().replace('# === 文档:', '').replace('===', '').strip()
                current_content = []
            else:
                if current_file:
                    current_content.append(line)
        
        # 保存最后一个文件
        if current_file and current_content:
            files[current_file] = '\n'.join(current_content)
        
        # 如果没有找到文件分隔符，将整个内容作为README
        if not files:
            files['README.md'] = documentation
        
        return files
    
    def _generate_changelog(self, code_files: Dict[str, str]) -> str:
        """生成变更日志"""
        prompt = f"""
基于以下代码文件生成项目的变更日志（CHANGELOG.md）：

代码文件列表：
{list(code_files.keys())}

请生成标准的变更日志，包含：
1. 版本号（使用语义化版本）
2. 发布日期
3. 功能新增（Added）
4. 功能变更（Changed）
5. 问题修复（Fixed）
6. 已移除功能（Removed）

使用标准的Keep a Changelog格式。
"""
        
        return self._call_llm(prompt)
    
    def _generate_architecture_doc(self, architecture_design: str) -> str:
        """生成架构文档"""
        prompt = f"""
基于以下架构设计生成详细的架构文档：

{architecture_design}

请生成包含以下内容的架构文档：
1. 系统概述
2. 架构图（使用Mermaid语法）
3. 模块说明
4. 数据流图
5. 技术栈说明
6. 部署架构
7. 扩展性考虑

使用Markdown格式，包含图表和代码示例。
"""
        
        return self._call_llm(prompt)
    
    def generate_api_docs(self, code_files: Dict[str, str]) -> str:
        """生成API文档"""
        prompt = f"""
基于以下代码生成详细的API文档：

{self._format_code_files(code_files)}

请生成OpenAPI 3.0格式的API文档，包含：
1. API概述
2. 认证方式
3. 端点详细说明
4. 请求/响应示例
5. 错误码说明
6. 使用示例

使用Markdown格式展示。
"""
        
        return self._call_llm(prompt)
    
    def generate_user_guide(self, requirement_analysis: str, code_files: Dict[str, str]) -> str:
        """生成用户指南"""
        prompt = f"""
基于以下需求分析和代码实现生成用户指南：

需求分析：
{requirement_analysis}

代码实现：
{self._format_code_files(code_files)}

请生成详细的用户指南，包含：
1. 功能介绍
2. 使用教程
3. 配置说明
4. 示例和最佳实践
5. 常见问题解答
6. 故障排除

面向非技术用户，语言简洁易懂。
"""
        
        return self._call_llm(prompt) 